package com.project.until;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.Map;

@Component
/**
 * JWT工具类
 */
public class JWTUtil {
    /**
     * 创建JWT
     * @return JWT字符串
     */
    public String createToken(Map<String,String> map){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE,30);
        // 创建JWT -- 使用JWT.create()方法进行创建
        // 此时builder对象中默认设置了header--标头，默认为JWT
        JWTCreator.Builder builder = JWT.create();
        // 将信息写入有效载荷中，payload中
        for(String key : map.keySet()){
            // 通过 withClaim方法传入输入到payload中
            builder.withClaim(key,map.get(key));

        }
        // 利用builder和签名创建token 同时利用Calendar类设置过期时间
        String token = builder.withExpiresAt(calendar.getTime())
                .sign(Algorithm.HMAC256("lovo!"));
        return token;
    }

    /**
     * 根据token和键解码信息
     * @param token token
     * @param key 键
     * @return 对应的值
     */
    public String verify(String token,String key){
        // 创建解码对象  利用JWT签名去完成解码对象的创建
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("lovo!")).build();
        // 包含了JWT解码信息
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        // 利用键，得到存放在有效负载 payload中的数据
        String value = decodedJWT.getClaim(key).asString();
        return value;
    }

}
